<?php
    //1.定义命名空间与本文件所在目录层级相同（houdunwang/core）
    //2.因为composer自动载入类的需要
    //3.命名空间namespace之前不能有输出！
    namespace houdunwang\core;

    //1.定义启动项的类（由入口文件index.php访问）
    //2.执行框架的初始化设置及调用控制器的方法（app命名空间中）
    class Boot{
        //1.开放供外部调用的公共函数
        //2.调用本类中的私有初始化方法init()、执行应用控制器的方法appRun()
        public static function run(){
            //错误处理
            self::handelError();
            //执行初始化设置函数
            self::init();
            //执行调用控制器的方法
            self::appRun();
        }

        static private function handelError() {
            $whoops = new \Whoops\Run;
            $whoops->pushHandler( new \Whoops\Handler\PrettyPageHandler );
            $whoops->register();
        }


        //1.定义框架初始化的一些设置
        //2.设置时区、开启session及判断提交方式的常量IS_POST
        private static function init(){
            //设置默认时区
            date_default_timezone_set("PRC");
            //cookie当中session_id()不存在的话则开户session服务
            session_id() || session_start();
            //定义判断页面提交方式的常量
            //用于在用户以post提交时判断并决定执行if(IS_POST){}花括号中代码块
            define("IS_POST",$_SERVER["REQUEST_METHOD"]=="POST"?TRUE:FALSE);

            //1.定义一个常量用于在?home/entry/add方法中提交后链接跳转时需要组合用的跳转地址
            //2.用在houdunwang/core/functions.php中的u函数
            //p($_SERVER);
            $url = "http://".$_SERVER["HTTP_HOST"].$_SERVER["SCRIPT_NAME"];
            define("__ROOT__",$url);
        }

        //1.定义执行【app命名空间】下控制器方法的函数
        //2.根据get参数的不同而执行不同的方法
        private static function appRun(){
            //1.判断地址栏是否有get参数
            //2.（用于组合将要调用的方法及载入的模板文件）
            //3.get参数一次性获取将调用控制器类下方法的名称（通过”/“连接）
            $s = isset($_GET["s"])?strtolower($_GET["s"]):"home/entry/index";
            //以“/”为分隔符将上述需要使用的参数分割成数组便于获取调用
            $arr = explode("/",$s);
            //获取模块名
            $module = $arr[0];
            //获取控制器类名
            $controller = $arr[1];
            //获取控制器中的方法名
            $action = $arr[2];

            //1.定义常量用于组合模板文件路径的字符串
            //2.需要写在call_user_func_array()上面，
            //3.因为载入模板（执行View.php中函数）首先需要这些常量，
            //4.MODULE用于模块文件夹名如“home”
            //CONTROLLER用于控制器文件夹名如“entry"
            //ACTION用于方法名文件如"index"（即最终的模板文件）
            //1.定义值为模块名的常量MODULE；
            //2.用于组合模板文件的路径字符串
            define("MODULE",$module);
            //1.定义值为控制器名的常量
            //2.用于组合模板文件的路径字符串
            define("CONTROLLER",$controller);
            //1.定义值为方法名的常量
            //2.用于组合模板文件的路径字符串
            define("ACTION",$action);

            //类名首字母要大写
            $controller = ucfirst($controller);
            //组合需要实例化的类名
            //加上两个反斜杠其中一个代表转义（否则只有一个的话会将$符转义掉）
            //（使得变量$module及$controller不能解析）
            $class = "\app\\$module\controller\\$controller";
            //调用控制器类名下的方法
            //实例化$class调用其中的$action方法
            //即由启动项去调用应用控制器中的方法
            //（__toString方法实现载入：echo 对象会自动触发[触发载入模板文件]）
            echo call_user_func_array([new $class,$action],[]);
        }



    }// class boot